package com.edais.service.imp;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONException;
import net.sf.json.JSONObject;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.edais.axis.WebServiceUtil;
import com.edais.dao.PushDao;
import com.edais.domain.PushMessageDetail;
import com.edais.domain.PushMessages;
import com.edais.service.PushService;
import com.edais.util.BeanUtil;
import com.edais.util.CommonUtil;
import com.edais.util.Consts;
import com.edais.util.MD5;
import com.edais.util.Message;
import com.edais.vo.PushMessageDetailVo;
import com.edais.vo.PushMessagesVo;

@Service

public class PushServiceImp implements PushService {
	private static final Log logger = LogFactory.getLog(PushServiceImp.class);

	@Autowired
	private PushDao pushDao;

	@Override
	public String getMessageList(String userId, Integer current, Integer pageSize) throws Exception {
		Map<String, Object> resultMap = new HashMap<String,Object>();
		String result = "";
		 
		int rowBegin = (current - 1 ) * pageSize;
		int rowEnd = pageSize;
		int totalNum = pushDao.getMesTotalNum(userId);
		
		resultMap.put("listSize", totalNum);
		List<PushMessagesVo> voList = new ArrayList<PushMessagesVo>();
		
		if(totalNum <= 0){
			resultMap.put("list", voList);
			result = CommonUtil.setResultStringCn(
				resultMap,Consts.SUCCESS_CODE, Consts.SUCCESS_DESCRIBE, Message.CnDescriptionInfo.NOT_RECORD);
			return result;
		}else{
			List<PushMessages> list = pushDao.getMessageList(userId, rowBegin, rowEnd);
			for(PushMessages pushMessages: list){
				PushMessagesVo pushMessagesVo = new PushMessagesVo();
				pushMessagesVo.setSendTime(null == pushMessages.getSend_time()?"":pushMessages.getSend_time());
				pushMessagesVo.setThemeChName(null == pushMessages.getTheme_ch_name()?"":pushMessages.getTheme_ch_name());
				pushMessagesVo.setMessageId(pushMessages.getRecord_id());
				voList.add(pushMessagesVo);
			}
			resultMap.put("list", voList);
			result = CommonUtil.setResultStringCn(
				resultMap,Consts.SUCCESS_CODE, Consts.SUCCESS_DESCRIBE, "");
		}
		return result;
	}

	@Override
	public String getMessageDetail(String messageId) throws Exception {
		Map<String, Object> resultMap = new HashMap<String,Object>();
		String result = "";
		
		PushMessageDetail pushMessageDetail = pushDao.getMessageDetail(messageId);
		
		if(pushMessageDetail != null){
			PushMessageDetailVo  pushMessageDetailVo = new PushMessageDetailVo();
			pushMessageDetailVo.setPushContent(null == pushMessageDetail.getPush_content()?"":pushMessageDetail.getPush_content());
			pushMessageDetailVo.setSendTime(null == pushMessageDetail.getSend_time()?"":pushMessageDetail.getSend_time());
			pushMessageDetailVo.setThemeChName(null == pushMessageDetail.getTheme_ch_name()?"":pushMessageDetail.getTheme_ch_name());
			resultMap = BeanUtil.getMapFromBean(pushMessageDetailVo);
			result = CommonUtil.setResultStringCn(
				resultMap,Consts.SUCCESS_CODE, Consts.SUCCESS_DESCRIBE, "");
		}else{
			result = CommonUtil.setResultStringCn(
				resultMap,Consts.SUCCESS_CODE, Consts.SUCCESS_DESCRIBE, Message.CnDescriptionInfo.NOT_RECORD);
		}
		return result;
	}

	

	/**
	 * 注销设备号
	 * @return 
	 */
	@Override
	@Transactional
	public Map cancelDevice(Map<String,String> paramsMap) throws Exception {
		Map<String, String> resultMap = new HashMap<String, String>();
		paramsMap.put("userIdCancel", (String) paramsMap.get("userId"));
		paramsMap.put("deviceNumCancel", (String) paramsMap.get("deviceNo"));
		//resultMap = this.pamaCancel(paramsMap);
		
		//设备注销200002
		Map cancelMap = this.pamaCancel(paramsMap);
		if("00000".equals(cancelMap.get("code"))){
			resultMap.put("code","00000");//结果
			resultMap.put("resmsg", "用户【"+(String) paramsMap.get("userId")+"】注销设备【"+(String) paramsMap.get("deviceNo")+"】"+"成功");
		}else{
			resultMap.put("code","00001");//结果
			resultMap.put("resmsg", "用户【"+(String) paramsMap.get("userId")+"】注销设备【"+(String) paramsMap.get("deviceNo")+"】"+"失败");
		}
		return resultMap;
		
	}


	/**
	 * 注册设备号
	 * @return 
	 * */
	@Override
	@Transactional
	public Map addDevice(Map<String,String> paramsMap) throws Exception {
		Map<String, String> resultMap = new HashMap<String, String>();
		//resultMap.putAll(paramsMap);
		//解析参数
		String userId = paramsMap.get("userId");// 用户id
		String deviceNo = paramsMap.get("deviceNo");// 设备编号
		/**
		 * 如果设备号和用户都没有、则注册设备。（设备注册接口）
		 * 如果该用户已经存在设备了、则替换成新设备号。（设备变更接口,设备注销接口）
		 * 如果该设备号被占用、则把该设备对应的用户替换成新用户。（设备变更接口,设备注销接口）
		 * 如果设备号和用户都一致、保持原样。
		 */
		
		/**
		 * 服务端根据客户端上送的设备号进行检查，
		 * 	如果该设备号不存在，检查上送的userId对应用户是否有设备，如没有，进行注册；如有，注销原记录（该用户对应的设备记录），注册新记录。
			如果该设备号已经存在，则查看该设备对应的用户是否存在，
			如果该设备号已经存在，则查看该设备对应的用户是否存在，
				如不存，在则注销原记录（该设备对应的用户记录），注册新记录；
				如存在，检查上送的userId与数据库中的userId 及 上送的设备与数据库中的设备 是否一致，
					如一致，不操作；
					如不一致，注销原记录(指定用户对应的设备，以及指定设备对应的用户)；注册新记录。
		 */
		
		// 查询  推送用户与设备的关系
		List<Map> mapDeviceList = pushDao.getPushUserDeviceByDevice(paramsMap);
		//{deviceNum=525b7cf659a67159ef990b1556ac312e75231ef3eb841b852700d5c7ca762e7d, userId=2731804}
		// 根据客户端上送的设备号进行检查，
		if(null==mapDeviceList||mapDeviceList.isEmpty()){
			// 如果该设备号不存在，检查上送的userId对应用户是否有设备
			List<Map> mapUserList = pushDao.getPushUserDeviceByUser(paramsMap);
			if(null==mapUserList||mapUserList.isEmpty()){
				// 如没有，进行注册；
				// 设备注册  200001
				Map registMap = this.pamaRegist(paramsMap);
				if("00000".equals(registMap.get("code"))){
					resultMap.put("code","00000");//成功
					resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"成功");
				}else{
					resultMap.put("code","00001");//结果
					resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"失败");
				}
			}else{
				// 如有，注销原记录（该用户对应的设备记录），注册新记录。
				for(int i=0;i<mapUserList.size();i++){
					Map mapUser = mapUserList.get(i);
					// 设备注销 200002
					paramsMap.put("userIdCancel", (String) mapUser.get("userId"));
					paramsMap.put("deviceNumCancel", (String) mapUser.get("deviceNum"));
					Map cancelMap = this.pamaCancel(paramsMap);
					if("00000".equals(cancelMap.get("code"))){
						resultMap.put("code","00000");//结果
						resultMap.put("resmsg", "用户【"+(String) mapUser.get("userId")+"】注销设备【"+(String) mapUser.get("deviceNum")+"】"+"成功");
					}else{
						resultMap.put("code","00001");//结果
						resultMap.put("resmsg", "用户【"+(String) mapUser.get("userId")+"】注销设备【"+(String) mapUser.get("deviceNum")+"】"+"失败");
					}
				}
				// 设备注册  200001
				Map registMap = this.pamaRegist(paramsMap);
				if("00000".equals(registMap.get("code"))){
					resultMap.put("code","00000");//成功
					resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"成功");
				}else{
					resultMap.put("code","00001");//结果
					resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"失败");
				}
			}
		}else{
			//如果该设备号已经存在，则查看该设备对应的用户是否存在，
			List<Map> mapUserList = pushDao.getPushUserDeviceByUser(paramsMap);
			if(null==mapUserList||mapUserList.isEmpty()){
				//如用户不存在，则注销原记录（该设备对应的用户记录），注册新记录；
				for(int i=0;i<mapDeviceList.size();i++){
					Map mapDevice = mapDeviceList.get(i);
					// 设备注销 200002
					paramsMap.put("userIdCancel", (String) mapDevice.get("userId"));
					paramsMap.put("deviceNumCancel", (String) mapDevice.get("deviceNum"));
					Map cancelMap = this.pamaCancel(paramsMap);
					if("00000".equals(cancelMap.get("code"))){
						resultMap.put("code","00001");//结果
						resultMap.put("resmsg", "用户【"+(String) mapDevice.get("userId")+"】注销设备【"+(String) mapDevice.get("deviceNum")+"】"+"成功");
					}else{
						resultMap.put("code","00001");//结果
						resultMap.put("resmsg", "用户【"+(String) mapDevice.get("userId")+"】注销设备【"+(String) mapDevice.get("deviceNum")+"】"+"失败");
					}
				}
				// 设备注册  200001
				Map registMap = this.pamaRegist(paramsMap);
				if("00000".equals(registMap.get("code"))){
					resultMap.put("code","00000");//成功
					resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"成功");
				}else{
					resultMap.put("code","00001");//结果
					resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"失败");
				}
			}else{
				// 如用户存在，
				//检查上送的userId与数据库中的userId 及 上送的设备与数据库中的设备 是否一致，
				if(1==mapUserList.size()&&1==mapDeviceList.size()){
					//如一致(仅一条记录)，不操作；
					Map mapDevice = mapDeviceList.get(0);
					Map mapUser = mapUserList.get(0);
					String userIdDb = (String) mapUser.get("userId");
					String deviceNumDb = (String) mapUser.get("deviceNum");
					//如一致
					if(userId.equals(userIdDb) && deviceNo.equals(deviceNumDb)){
						resultMap.put("code","00000");//成功
						resultMap.put("resmsg", "用户【"+userIdDb+"】已经注册过了设备【"+deviceNumDb+"】");
						logger.debug("用户【"+userIdDb+"】已经注册了设备【"+deviceNumDb+"】");
					}else{
						// 设备注销 200002
						{
							paramsMap.put("userIdCancel", (String) mapDevice.get("userId"));
							paramsMap.put("deviceNumCancel", (String) mapDevice.get("deviceNum"));
							Map cancelMap = this.pamaCancel(paramsMap);
							if("00000".equals(cancelMap.get("code"))){
								resultMap.put("code","00001");//结果
								resultMap.put("resmsg", "用户【"+(String) mapDevice.get("userId")+"】注销设备【"+(String) mapDevice.get("deviceNum")+"】"+"成功");
							}else{
								resultMap.put("code","00001");//结果
								resultMap.put("resmsg", "用户【"+(String) mapDevice.get("userId")+"】注销设备【"+(String) mapDevice.get("deviceNum")+"】"+"失败");
							}
						}
						// 设备注销 200002
						{
							paramsMap.put("userIdCancel", (String) mapUser.get("userId"));
							paramsMap.put("deviceNumCancel", (String) mapUser.get("deviceNum"));
							Map cancelMap = this.pamaCancel(paramsMap);
							if("00000".equals(cancelMap.get("code"))){
								resultMap.put("code","00001");//结果
								resultMap.put("resmsg", "用户【"+(String) mapUser.get("userId")+"】注销设备【"+(String) mapUser.get("deviceNum")+"】"+"成功");
							}else{
								resultMap.put("code","00001");//结果
								resultMap.put("resmsg", "用户【"+(String) mapUser.get("userId")+"】注销设备【"+(String) mapUser.get("deviceNum")+"】"+"失败");
							}
						}
						// 设备注册  200001
						Map registMap = this.pamaRegist(paramsMap);
						if("00000".equals(registMap.get("code"))){
							resultMap.put("code","00000");//成功
							resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"成功");
						}else{
							resultMap.put("code","00001");//结果
							resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"失败");
						}
					}
				}else{
					// 如不一致(存在多条记录)，注销原记录(指定用户对应的设备，以及指定设备对应的用户)；注册新记录。
					for(int i=0;i<mapUserList.size();i++){
						Map mapUser = mapUserList.get(i);
						// 设备注销 200002
						paramsMap.put("userIdCancel", (String) mapUser.get("userId"));
						paramsMap.put("deviceNumCancel", (String) mapUser.get("deviceNum"));
						Map cancelMap = this.pamaCancel(paramsMap);
						if("00000".equals(cancelMap.get("code"))){
							resultMap.put("code","00001");//结果
							resultMap.put("resmsg", "用户【"+(String) mapUser.get("userId")+"】注销设备【"+(String) mapUser.get("deviceNum")+"】"+"成功");
						}else{
							resultMap.put("code","00001");//结果
							resultMap.put("resmsg", "用户【"+(String) mapUser.get("userId")+"】注销设备【"+(String) mapUser.get("deviceNum")+"】"+"失败");
						}
					}
					
					for(int k=0;k<mapDeviceList.size();k++){
						Map mapDevice = mapDeviceList.get(k);
						// 设备注销 200002
						paramsMap.put("userIdCancel", (String) mapDevice.get("userId"));
						paramsMap.put("deviceNumCancel", (String) mapDevice.get("deviceNum"));
						Map cancelMap = this.pamaCancel(paramsMap);
						if("00000".equals(cancelMap.get("code"))){
							resultMap.put("code","00001");//结果
							resultMap.put("resmsg", "用户【"+(String) mapDevice.get("userId")+"】注销设备【"+(String) mapDevice.get("deviceNum")+"】"+"成功");
						}else{
							resultMap.put("code","00001");//结果
							resultMap.put("resmsg", "用户【"+(String) mapDevice.get("userId")+"】注销设备【"+(String) mapDevice.get("deviceNum")+"】"+"失败");
						}
					}
					// 设备注册  200001
					Map registMap = this.pamaRegist(paramsMap);
					if("00000".equals(registMap.get("code"))){
						resultMap.put("code","00000");//成功
						resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"成功");
					}else{
						resultMap.put("code","00001");//结果
						resultMap.put("resmsg", "用户【"+ userId +"】注册设备【"+ deviceNo +"】"+"失败");
					}
				}
			}
		}
		return resultMap;
	}
	
	/**
	 * 封装请求参数
	 * @param paramsMap
	 * @return 
	 * @throws Exception
	 */
	 Map<String, String> getRegistRequestMap(Map<String,String> paramsMap) throws Exception{
		// 解析参数
		String userId = paramsMap.get("userId");// 用户id
		String deviceNo = paramsMap.get("deviceNo");// 设备编号
		String deviceType = paramsMap.get("deviceType");// 设备类型：1.表示IOS，2.表示android
		
		// 返回map
		Map<String,String> requestMap = new HashMap<String, String>();
		
		// 准备上送参数
		requestMap.put("userNo", MD5.md5(userId));//用户编号
		requestMap.put("deviceNo", deviceNo);//设备编号
		requestMap.put("deviceType", deviceType);//设备类型
		
		// 统一参数
		requestMap.put("seq", getPushSeq());//自定义流水号
		String reqTimestamp = new Date().getTime()+"";
		requestMap.put("reqTimestamp", reqTimestamp);//该接口调用方的调用时间
		
		//设备类型：1.表示IOS，2.表示android
		if("1".equals(deviceType)){
			requestMap.put("projectNo", Consts.PushInfo.PROJECT_NO);//projectNo,消息来源项目编号
			requestMap.put("groupNo", "002");//groupNo,用户组编号
			requestMap.put("groupName", "group_ios");//groupName,用户组名
			//requestMap.put("userName", MD5.md5(userId));//用户名
			requestMap.put("userName", "ios_"+userId);//用户名
			requestMap.put("deviceSn", "ios_"+deviceNo);//设备序列号
		}else if("2".equals(deviceType)){
			requestMap.put("projectNo", Consts.PushInfo.PROJECT_NO);//projectNo
			requestMap.put("groupNo", "001");//groupNo
			requestMap.put("groupName", "group_android");//groupName
			//requestMap.put("userName", MD5.md5(userId));//用户名
			requestMap.put("userName", "android_"+userId);//用户名
			requestMap.put("deviceSn", "android_"+deviceNo);//设备序列号
		}
		return requestMap;
	}
	 
	 /**
	 * 封装请求参数
	 * @param paramsMap
	 * @return 
	 * @throws Exception
	 */
	 Map<String, String> getCannerRequestMap(Map<String,String> paramsMap) throws Exception{
		// 解析参数
		String userId = paramsMap.get("userIdCancel");// 用户id,注销用户id
		String deviceNo = paramsMap.get("deviceNumCancel");// 设备编号
		//String deviceType = paramsMap.get("deviceType");// 设备类型：1.表示IOS，2.表示android
		
		// 返回map
		Map<String,String> requestMap = new HashMap<String, String>();
		
		// 准备上送参数
		requestMap.put("userNo", MD5.md5(userId));//用户编号
		requestMap.put("deviceNo", deviceNo);//设备编号
		//requestMap.put("deviceType", deviceType);//设备类型
		
		// 统一参数
		requestMap.put("seq", getPushSeq());//自定义流水号
		String reqTimestamp = new Date().getTime()+"";
		requestMap.put("reqTimestamp", reqTimestamp);//该接口调用方的调用时间
		
		//设备类型：1.表示IOS，2.表示android
		//if("1".equals(deviceType)){
			requestMap.put("projectNo", Consts.PushInfo.PROJECT_NO);//projectNo,消息来源项目编号
			//requestMap.put("groupNo", "002");//groupNo,用户组编号
			//requestMap.put("groupName", "group_ios");//groupName,用户组名
			//requestMap.put("userName", MD5.md5(userId));//用户名
			//requestMap.put("userName", "ios_"+userId);//用户名
			//requestMap.put("deviceSn", "ios_"+deviceNo);//设备序列号
		//}else if("2".equals(deviceType)){
			//requestMap.put("projectNo", Consts.PushInfo.PROJECT_NO);//projectNo
			//requestMap.put("groupNo", "001");//groupNo
			//requestMap.put("groupName", "group_android");//groupName
			//requestMap.put("userName", MD5.md5(userId));//用户名
			//requestMap.put("userName", "android_"+userId);//用户名
			//requestMap.put("deviceSn", "android_"+deviceNo);//设备序列号
		//}
		return requestMap;
	}
	 
	 /**
	 * 添加 请求消息推送系统API记录
	 * @param paramsMap
	 * @throws Exception
	 */
	public void addPushAPIRecord(Map<String,String> paramsMap) throws Exception {
		//解析参数
		String userId = paramsMap.get("userId");// 用户id
		//String deviceNo = paramsMap.get("deviceNo");// 设备编号
		//String deviceType = paramsMap.get("deviceType");// 设备类型：1.表示IOS，2.表示android
		
		//添加
		Map<String,String> dbMap = new HashMap<String, String>();
//		dbMap.put("userId", userId);//用户ID
//		dbMap.put("deviceNum", deviceNo);//设备编号
//		dbMap.put("deviceType", deviceType);//设备类型（1：IOS；2：安卓）
//		dbMap.put("pushUserId", MD5.md5(userId));//推送系统用户编号（用户id经过编码）
		//requestMap.put("seq", getPushSeq());//自定义流水号
		String sn = Consts.PushInfo.PROJECT_NO + this.getPushSeq();
		
		dbMap.put("flowNum", sn);//推送流水号
		dbMap.put("requestContent", paramsMap.get("requestContent"));//请求内容
		dbMap.put("interfaceName", paramsMap.get("interfaceName"));//接口名称
		dbMap.put("coment", paramsMap.get("coment"));//备注
		
		dbMap.put("createPer", userId);//创建人
		dbMap.put("updatePer", userId);//更新人
		
		//设备类型：1.表示IOS，2.表示android
//		if("1".equals(deviceType)){
//			dbMap.put("groupNum", "002");//用户组编号
//			dbMap.put("groupName", "group_ios");//用户组名
//			dbMap.put("userName", "ios_"+userId);//用户名
//			dbMap.put("deviceSn", "ios_"+deviceNo);//设备序列号
//		}else if("2".equals(deviceType)){
//			dbMap.put("groupNum", "001");//用户组编号
//			dbMap.put("groupName", "group_android");//用户组名
//			dbMap.put("userName", "android_"+userId);//用户名
//			dbMap.put("deviceSn", "android_"+deviceNo);//设备序列号
//		}
		pushDao.insertPushAPIRecorde(dbMap);
	}
	
	/**
	 * 添加 推送用户与设备的关系
	 * @param paramsMap
	 * @throws Exception
	 */
	public void addPushUserDevice(Map<String,String> paramsMap) throws Exception {
		//解析参数
		String userId = paramsMap.get("userId");// 用户id
		String deviceNo = paramsMap.get("deviceNo");// 设备编号
		String deviceType = paramsMap.get("deviceType");// 设备类型：1.表示IOS，2.表示android
		
		//添加,推送用户与设备的关系
		Map<String,String> dbMap = new HashMap<String, String>();
		dbMap.put("userId", userId);//用户ID
		dbMap.put("deviceNo", deviceNo);//设备编号
		dbMap.put("deviceType", deviceType);//设备类型（1：IOS；2：安卓）
		dbMap.put("pushUserId", MD5.md5(userId));//推送系统用户编号（用户id经过编码）
		dbMap.put("createPer", userId);//创建人
		dbMap.put("updatePer", userId);//更新人
		
		//设备类型：1.表示IOS，2.表示android
		if("1".equals(deviceType)){
			dbMap.put("groupNum", "002");//用户组编号
			dbMap.put("groupName", "group_ios");//用户组名
			dbMap.put("userName", "ios_"+userId);//用户名
			dbMap.put("deviceSn", "ios_"+deviceNo);//设备序列号
		}else if("2".equals(deviceType)){
			dbMap.put("groupNum", "001");//用户组编号
			dbMap.put("groupName", "group_android");//用户组名
			dbMap.put("userName", "android_"+userId);//用户名
			dbMap.put("deviceSn", "android_"+deviceNo);//设备序列号
		}
		
		//查询之前对应注销无效记录，如没有注销过的记录，则新增；如果有，则从无效状态改为有效状态
		dbMap.put("status", "0");//0-无效；1-有效
		List<Map> mapList = pushDao.getPushUserDeviceByUserDevice(dbMap);
		if(null==mapList||mapList.isEmpty()){
			dbMap.put("status", "1");//0-无效；1-有效
			pushDao.insertPushUserDevice(dbMap);
		}else{
			dbMap.put("status", "1");//0-无效；1-有效
			pushDao.updatePushUserDeviceOnly(dbMap);
		}
		
	}
	
	/**
	 * 修改  推送用户与设备的关系
	 * @param paramsMap
	 * @throws Exception
	 */
	public void modifyPushUserDevice(Map<String,String> paramsMap) throws Exception {
		//解析参数
		String userId = paramsMap.get("userIdCancel");// 用户id
		String deviceNo = paramsMap.get("deviceNumCancel");// 设备编号
		String deviceType = paramsMap.get("deviceType");// 设备类型：1.表示IOS，2.表示android
		
		//添加,推送用户与设备的关系
		Map<String,String> dbMap = new HashMap<String, String>();
		dbMap.put("userId", userId);//用户ID
		dbMap.put("deviceNo", deviceNo);//设备编号
		dbMap.put("deviceType", deviceType);//设备类型（1：IOS；2：安卓）
		dbMap.put("pushUserId", MD5.md5(userId));//推送系统用户编号（用户id经过编码）
		dbMap.put("createPer", userId);//创建人
		dbMap.put("updatePer", userId);//更新人
		
		//设备类型：1.表示IOS，2.表示android
		if("1".equals(deviceType)){
			dbMap.put("groupNum", "002");//用户组编号
			dbMap.put("groupName", "group_ios");//用户组名
			dbMap.put("userName", "ios_"+userId);//用户名
			dbMap.put("deviceSn", "ios_"+deviceNo);//设备序列号
		}else if("2".equals(deviceType)){
			dbMap.put("groupNum", "001");//用户组编号
			dbMap.put("groupName", "group_android");//用户组名
			dbMap.put("userName", "android_"+userId);//用户名
			dbMap.put("deviceSn", "android_"+deviceNo);//设备序列号
		}
		
		//查询之前对应有效记录:如果没有，则新增注册记录;如果有有效的记录，则修改为无效。
		dbMap.put("status", "1");//0-无效；1-有效
		List<Map> mapList = pushDao.getPushUserDeviceByUserDevice(dbMap);
		if(null==mapList||mapList.isEmpty()){
			dbMap.put("status", "0");//0-无效；1-有效
			pushDao.insertPushUserDevice(dbMap);
		}else
		{
			dbMap.put("status", "0");//0-无效；1-有效
			pushDao.updatePushUserDevice(dbMap);
		}
		
	}
	
	/**
	 * 设备注册接口参数
	 * @throws Exception 
	 */
	@Transactional
	Map pamaRegist(Map<String,String> paramsMap) throws Exception{
		Map<String, String> resultMap = new HashMap<String, String>();
		// 设备注册200001
		Map<String,String> requestMap =this.getRegistRequestMap(paramsMap);
		JSONObject pamaObj = this.pama_regist(requestMap);
		if(pamaObj == null){
			resultMap.put("resmsg", "请求参数为空");
			return resultMap;
		}
		String requset = pamaObj.toString();
		String response = WebServiceUtil.doRequest("200001", "dispatchCommand",requset ).toString();
		//System.out.println(response);
		JSONObject jsonObject = JSONObject.fromObject(response);
		//根据成功失败情况进行不同的处理:0000	成功
		String code = jsonObject.getString("code");
		String msg = jsonObject.getString("msg");
		//System.out.println("code:"+code);
		if("0000".equals(code)){
			//操作数据库
			this.addPushUserDevice(paramsMap);//添加 推送用户与设备的关系
			resultMap.put("code","00000");//成功
			resultMap.put("resmsg", "调用推送系统设备注册200001接口："+msg);
		}else{
			resultMap.put("code", code);//失败
			resultMap.put("resmsg", "调用推送系统设备注册200001接口："+msg);
			logger.debug("调用推送系统设备注册200001接口："+msg);
			//改为key值
			//throw new Exception(",注销设备失败,"+msg);
		}
		
		paramsMap.put("requestContent", requset);
		paramsMap.put("interfaceName", "调用设备注册200001接口");
		paramsMap.put("coment", response);
		//操作数据库
		this.addPushAPIRecord(paramsMap);//添加 请求消息推送系统API记录
		return resultMap;
	}
	
	/**
	 * 设备注册接口参数
	 */
	private JSONObject pama_regist(Map<String,String> map) {
		if (map == null) {
			return null;
		} else {
			String reqTimestamp = map.get("reqTimestamp").toString();//该接口调用方的调用时间
			String projectNo = map.get("projectNo").toString();//消息来源项目编号
			String groupNo = map.get("groupNo").toString();//用户组编号
			String groupName = map.get("groupName").toString();//用户组名
			String userNo = map.get("userNo").toString();//用户编号
			String userName = map.get("userName").toString();//用户名
			String deviceNo = map.get("deviceNo").toString();//设备编号
			String deviceSn = map.get("deviceSn").toString();//设备序列号
			String deviceType = map.get("deviceType").toString();//设备类型
			String sn = projectNo + map.get("seq").toString();
			//请求推送系统参数
			JSONObject params_city = new JSONObject();
			try {
				params_city.put("projectNo", projectNo);
				params_city.put("groupNo", groupNo);
				params_city.put("groupName", groupName);
				params_city.put("userNo", userNo);
				params_city.put("userName", userName);
				params_city.put("deviceNo", deviceNo);
				params_city.put("deviceSn", deviceSn);
				params_city.put("deviceType", deviceType);
				params_city.put("reqTimestamp", reqTimestamp);
				params_city.put("sn", sn);
				params_city.put("sign",
								MD5.md5(projectNo + groupNo + groupName
										+ userNo + userName + deviceNo
										+ deviceSn + deviceType + reqTimestamp
										+ sn + Consts.PushInfo.KEY));
			} catch (JSONException e) {
				e.printStackTrace();
			}
			return params_city;
		}
	}
	
	/**
	 * 设备注销接口
	 * @param paramsMap
	 * @throws Exception
	 */
	Map pamaCancel(Map<String,String> paramsMap) throws Exception{
		Map<String, String> resultMap = new HashMap<String, String>();
		// 设备注销200002
		Map<String,String> requestMap =this.getCannerRequestMap(paramsMap);
		JSONObject pamaObj = this.pama_cancel(requestMap);
		if(pamaObj == null){
			resultMap.put("resmsg", "请求参数为空");
			return resultMap;
		}
		String requset = pamaObj.toString();
		String response = WebServiceUtil.doRequest("200002", "dispatchCommand",requset).toString();
		//System.out.println(response);
		JSONObject jsonObject = JSONObject.fromObject(response);
		//根据成功失败情况进行不同的处理:0000	成功
		String code = jsonObject.getString("code");
		String msg = jsonObject.getString("msg");
		//System.out.println("code:"+code);
		if("0000".equals(code)){
			//操作数据库
			this.modifyPushUserDevice(paramsMap);//修改  推送用户与设备的关系 为无效
			resultMap.put("code","00000");//成功
			resultMap.put("resmsg", "调用推送系统设备注销200002接口:"+msg);
		}else{
			resultMap.put("code", code);//失败
			//即使失败，也要修改为无效
			this.modifyPushUserDevice(paramsMap);//修改  推送用户与设备的关系 为无效
			
			resultMap.put("resmsg", "调用推送系统设备注销200002接口:"+msg);
			logger.debug("调用推送系统设备注册200001接口："+msg);
		}
		paramsMap.put("requestContent", requset);
		paramsMap.put("interfaceName", "调用设备注销200002接口");
		paramsMap.put("coment", response);
		//操作数据库
		this.addPushAPIRecord(paramsMap);//添加 请求消息推送系统API记录
		return resultMap;
	}
	

	/**
	 * 设备注销接口参数
	 */
	private JSONObject pama_cancel(Map<String,String> map) {
		if (map == null) {
			return null;
		} else {
			String reqTimestamp = map.get("reqTimestamp").toString();//该接口调用方的调用时间
			String projectNo = map.get("projectNo").toString();
			String userNo = map.get("userNo").toString();
			String deviceNo = map.get("deviceNo").toString();
			String sn = projectNo + map.get("seq").toString();
			JSONObject params_city = new JSONObject();
			try {
				params_city.put("projectNo", projectNo);
				params_city.put("userNo", userNo);
				params_city.put("deviceNo", deviceNo);
				params_city.put("reqTimestamp", reqTimestamp);
				params_city.put("sn", sn);
				params_city.put("sign",
								MD5.md5(projectNo + userNo + deviceNo + reqTimestamp
										+ sn +  Consts.PushInfo.KEY));
			} catch (JSONException e) {
				e.printStackTrace();
			}
			return params_city;
		}
	}
	
	@Override
	@Transactional
	public void modifyDevice(Map<String,String> map) throws Exception {
		//  设备变更200003
		map.put("projectNo", "D");//消息来源项目编号
		map.put("seq", getPushSeq());//自定义流水号
		JSONObject pamaObj = pama_modify(map);
		if(pamaObj == null){
			return;
		}
		String mess = WebServiceUtil.doRequest("200003", "dispatchCommand", pamaObj.toString()).toString();
		System.out.println(mess);
	}
	
	/**
	 * 设备变更接口参数
	 */
	private JSONObject pama_modify(Map<String,String> map) {
		if (map == null) {
			return null;
		} else {
			String reqTimestamp = map.get("reqTimestamp").toString();//该接口调用方的调用时间
			String projectNo = map.get("projectNo").toString();
			String userNo = map.get("userNo").toString();
			String deviceNo = map.get("deviceNo").toString();
			String deviceSn = map.get("deviceSn").toString();
			String deviceType = map.get("deviceType").toString();
			String newUserNo = map.get("newUserNo").toString();
			String sn = projectNo + map.get("seq").toString();
			JSONObject params_city = new JSONObject();
			try {
				params_city.put("projectNo", projectNo);
				params_city.put("userNo", userNo);
				params_city.put("deviceNo", deviceNo);
				params_city.put("deviceSn", deviceSn);
				params_city.put("deviceType", deviceType);
				params_city.put("newUserNo", newUserNo);
				params_city.put("reqTimestamp", reqTimestamp);
				params_city.put("sn", sn);
				params_city.put("sign",
								MD5.md5(projectNo + userNo + deviceNo
										+ deviceSn + deviceType + reqTimestamp
										+ sn +  Consts.PushInfo.KEY));
				
			} catch (JSONException e) {
				e.printStackTrace();
			}
			return params_city;
		}
	}
	
	public String getPushSeq() throws Exception{
		return pushDao.getPushSeq();
	}
	
	

	
}
